 1.Kafka高级特性解析之物理存储中日志存储的概述
   
   Kafka 消息是以主题为单位进行归类，各个主题之间是彼此独立的，互不影响。
   每个主题又可以分为一个或多个分区。
   每个分区各自存在一个记录消息数据的日志文件。
   图中，创建了一个 tp_demo_01 主题，其存在6个 Parition，对应的每个Parition下存在⼀个 [Topic-Parition]
命名的消息日志文件。在理想情况下，数据流量分摊到各个 Parition 中，实现了负载均衡的效果。在分区日志文
件中，你会发现很多类型的文件，比如： .index、.timestamp、.log、.snapshot 等。
   其中，文件名一致的文件集合就称为 LogSement。
   1).LogSegment
   (1). 分区日志文件中包含很多的 LogSegment
   (2). Kafka 日志追加是顺序写⼊的
   (3). LogSegment 可以减小日志文件的大小
   (4). 进行日志删除的时候和数据查找的时候可以快速定位。
   (5). ActiveLogSegment 是活跃的日志分段，拥有文件拥有写入权限，其余的 LogSegment 只有只读的权限。
   日志文件存在多种后缀文件，重点需要关注 .index、.timestamp、.log 三种类型。
   类别作用
   后缀名                      说明
   .index                      偏移量索引文件
   .timestamp                  时间戳索引文件
   .log                        日志文件
   .snapshot                   快照文件
   .deleted
   .cleaned                    日志清理时临时文件
   .swap                       日志压缩之后的临时文件
   leader-epoch-checkpoint
   每个 LogSegment 都有一个基准偏移量，表示当前 LogSegment 中第一条消息的 offset。
   偏移量是一个64位的长整形数，固定是20位数字，长度未达到，用0 进行填补，索引文件和日志文件都由该作
为文件名命名规则（00000000000000000000.index、00000000000000000000.timestamp、00000000000000000000.log)。
   如果日志文件名为00000000000000000121.log ，则当前文志⽂件的⼀条数据偏移量就是121(偏移量从0 开始)。
   日志与索引文件
   配置条目                   默认值          说明
   log.index.interval.bytes   4096(4K)        增加索引项字节间隔密度，会影响
                                              索引文件中的区间密度和查询效率
   log.segment.bytes        1073741824(1G)    日志文件最大值
   log.roll.ms                                当前日志分段中消息的最大时间戳与当前系
                                              统的时间戳的差值允许的最大范围,单位毫秒
   log.roll.hours            168(7天)         当前日志分段中消息的最大时间戳与当前系
                                              统的时间戳的差值允许的最大范围,单位小时
   log.index.size.max.bytes 10485760(10MB)    触发偏移量索引文件或时间戳索引文件分段字节限额
   配置项默认值说明
   偏移量索引文件用于记录消息偏移量与物理地址之间的映射关系。
   时间戳索引文件则根据时间戳查找对应的偏移量。
   Kafka中的索引文件是以稀疏索引的方式构造消息的索引，并不保证每一个消息在索引文件中都有对应的索引项。
   每当写一定量的消息时，偏移量索引文件和时间戳索引文件分别增加一个偏移量索引项和时间戳索引项。
   通过修改 log.index.interval.bytes 的值，改变索引项的密度。
   2).切分文件
   当满足如下几个条件中的其中之一，就会触发文件的切分：
   (1).当前日志分段文件的大小超过了 broker 端参数 log.segment.bytes 配置的值。log.segment.bytes 参
数的默认值为1073741824,即1GB。
   (2).当前日志分段中消息的最大时间戳与当前系统的时间戳的差值大于 log.roll.ms 或 log.roll.hours 参
数配置的值。如果同时配置了 log.roll.ms 和 log.roll.hours 参数，那么 log.roll.ms 的优先级高。默认
情况下，只配置了 log.roll.hours 参数，其值为168，即 7 天。
   (3).偏移量索引文件或时间戳索引文件的大小达到 broker 端参数 log.index.size.max.bytes 配置的值。
log.index.size.max.bytes 的默认值为10485760，即10MB。
   (4).追加的消息的偏移量与当前日志分段的偏移量之间的差值大于 Integer.MAX_VALUE ，即要追加的消息的偏
移量不能转变为相对偏移量。
   3)为什么是 Integer.MAX_VALUE ？
   1024 * 1024 * 1024 = 1073741824
   在偏移量索引文件中，每个索引项共占用8个字节，并分为两部分。
   相对偏移量和物理地址。
   相对偏移量：表示消息相对与基准偏移量的偏移量，占 4 个字节
   物理地址：消息在日志分段文件中对应的物理位置，也占 4 个字节
   4 个字节刚好对应Integer.MAX_VALUE,如果大于 Integer.MAX_VALUE,则不能用4个字节进行表示了。
   4).索引文件切分过程
   索引文件会根据 log.index.size.max.bytes 值进行预先分配空间，即文件创建的时候就是最⼤值
   当真正的进行索引文件切分的时候，才会将其裁剪到实际数据大小的文件。
   这一点是跟日志文件有所区别的地方。其意义降低了代码逻辑的复杂性。
   